#ifndef RTDB_H
#define RTDB_H

#include <QObject>
#include <QSharedMemory>
#include "ComStruct.h"

class CRTDB : public QObject//核心的实时数据库（RTDB）管理类,运行时内存数据库
{
	Q_OBJECT

public:
	CRTDB(int iBattStackNum/*电池堆-转发模块数*/, int iBANum/*BA数,100个通用输入寄存器*/, int iBattBankNum/*电池组数*/, QObject *parent = 0);
	~CRTDB();

public:
	int initRTDB(bool bReadWrite = false);

	CBattStack* getStack(int iBattStackIndex);//获取第几个电池堆的运行信息
	CBattBank* getBank(int iBattBankIndex);//获取某一电池组bank的运行数据
	CBAComReg* getBAComReg(int iBAIndex);//获取通用通讯寄存器的数据，用于modbus寄存器映射
	//访问ba模块时的寄存器接口
	int getComInputRegValBA(int iBAIndex, quint16 usRegAddr, quint16& usVal);
	int getComHoldRegValBA(int iBAIndex, quint16 usRegAddr, quint16& usVal);

	// Alarm
	CBankAlarm* getBankAlarm(int iBattBankIndex);//当前告警信息列表
	SAlarm* getFirstAlarm(int iBattBankIndex);//某一组的首个告警
	SAlarmParam* getAlarmParam(int iBattBankIndex);//某一编号的告警信息结构体

	SAlarm* getFirstAlarm(CBankAlarm* pBankAlarm);
	SAlarm* getAlarm(CBankAlarm* pBankAlarm, quint16 usNo);

	// DryWet
	void setDryWetCtrl(CBattBank* pBattBank, quint16 usDry1Ctrl, quint16 usDry2Ctrl, quint16 usDry3Ctrl, quint16 usDry4Ctrl, quint16 usWetCtrl, int iDry1CtrlNum, int iDry2CtrlNum, int iDry3CtrlNum, int iDry4CtrlNum, int iWetCtrlNum);
	void setDryCtrl1(CBattBank* pBattBank, quint16 usDry1Ctrl, quint16 usDry2Ctrl, int iDry1CtrlNum, int iDry2CtrlNum);
	void setDryCtrl2(CBattBank* pBattBank, quint16 usDry3Ctrl, quint16 usDry4Ctrl, int iDry3CtrlNum, int iDry4CtrlNum);
	void setWetCtrl(CBattBank* pBattBank, quint16 usWetCtrl, int iWetCtrlNum);

signals:
	void addLog(int iLogType, const QString& strLog);

private:
	int m_iBattStackNum;  /*电池堆-转发模块数*/,如主从结构中主机上挂多个堆
	int m_iBattBankNum;   /*电池组数*/,堆下面的逻辑模块
	int m_iBANum;         /*BA 数*/,对应一类保持/输入寄存器
	//共享内存块，用于不同进程间共享rtdb数据结构
	QSharedMemory* m_pSharedMemery;//qt共享内存对象，
	char* m_pRTDBData;//是该共享内存的指针，指向的是完整的rtdb数据区.
	//m_pRTDBData是该共享内存中的数据指针，实际运行数据都存在这块ram里
	//modbus服务程序可以从这块内存中读取某个寄存器值
	//ui进程或日志进程也能读取堆状态，电压温度等
	//共享内存能保证在不同线程/进程中操作同一份数据副本
};

#endif // RTDB_H
